/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
 
 
import java.awt.Image; 
import java.awt.event.KeyEvent; 
import javax.swing.ImageIcon; 

/**
 *
 * @author gabriel
 */
public class Pacman {
    
    
    private int puntos=0; 
    //coordenadas en el mapa, la posición exacta hay que calcularla con x**PacmanUtils.WIDTH, y**PacmanUtils.HEIGHT
    private int x=10,y=5; 
    private String pacmanRightPath = "/resources/pacman_right.jpeg";
    private Image imageR;
    private String pacmanLeftPath = "/resources/pacman_left.jpeg";
    private Image imageL;
    private String pacmanUpPath = "/resources/pacman_up.jpeg";
    private Image imageU;
    private String pacmanDownPath = "/resources/pacman_down.jpeg";
    private Image imageD;
    private Image imagenActual;
    private boolean invulnerable = false;
    private int tInvulnerable = 0;  
    
    
    /**
	 * TODO
	 * Pacman se iniciará en la posición... x,y con 0 puntos 
	 * @param puntos
	 */
	public Pacman(int puntos, int x, int y) {
            //pacman derecho
            ImageIcon iiPR = new ImageIcon(this.getClass().getResource(pacmanRightPath));
            imageR = iiPR.getImage();
            //pacman izquierdo
            iiPR = new ImageIcon(this.getClass().getResource(pacmanLeftPath));
            imageL = iiPR.getImage();
            //pacma arriba
             iiPR = new ImageIcon(this.getClass().getResource(pacmanUpPath));
            imageU = iiPR.getImage();
             //pacma abajo
             iiPR = new ImageIcon(this.getClass().getResource(pacmanDownPath));
            imageD = iiPR.getImage();
                    
            this.puntos = puntos;
            this.x = x;
            this.y = y;
	}

	 
	

    /**
     * Comprueba si el proximo movimiento es posible, avanza las coordenadas,
     * pinta, y si se encuentra un punto o galleta, actualiza los parámetros
     * y situa un 0 en esa posición del mapa
     * @param ultimaTeclaPulsada 
     */
    public Mapa avanza(int ultimaTeclaPulsada, Mapa map) {
           
        //test borrar
        System.out.println("Pacman.avanza, tecla: " + ultimaTeclaPulsada);
        //test borrar
         if(map.getElement(this.x, this.y)!='1' 
               && map.getElement(this.x, this.y)!='x'
               && map.getElement(this.x, this.y)!='='){
            
            map.setElement('0', this.x, this.y);
        }
                       

        if (ultimaTeclaPulsada == KeyEvent.VK_LEFT) {
            if (!colision(ultimaTeclaPulsada, map)){
                this.imagenActual = this.imageL;
                this.x--;
            }
        }
        if (ultimaTeclaPulsada == KeyEvent.VK_RIGHT) {
            if (!colision(ultimaTeclaPulsada, map)){
                this.imagenActual = this.imageR;
                this.x++;
            }
        }
        if (ultimaTeclaPulsada == KeyEvent.VK_UP) {
            if (!colision(ultimaTeclaPulsada, map)){
                 this.imagenActual = this.imageU;
                 this.y--;
            }
        }
        if (ultimaTeclaPulsada == KeyEvent.VK_DOWN) {
            if (!colision(ultimaTeclaPulsada, map)){
                 this.imagenActual = this.imageD;
                 this.y++;
            }
        }
        
       //actualizamos estados
        if(map.getElement(this.x, this.y)=='3'){
            this.puntos += PacmanUtils.PUNTO_MINI; 
            map.setElement('0',this.x,this.y);
        }
        
       
        if(map.getElement(this.x, this.y)=='2'){
            this.invulnerable = true; 
            this.tInvulnerable = PacmanUtils.TMAX_INVULNERABLE;
            map.setElement('0',this.x,this.y);
        }  
          //si vas al tunel sal por el otro lado
        if(map.getElement(this.x, this.y)=='='){
            map.setElement('=',this.x,this.y);
             if (this.x == 1); this.x = PacmanUtils.COLUMNAS;             
             if (this.x == PacmanUtils.COLUMNAS); this.x = 1;
        }
        
        //siutar a pacman en el mapa, no es necesario
        if(map.getElement(this.x, this.y)!='1' 
               && map.getElement(this.x, this.y)!='x'
               && map.getElement(this.x, this.y)!='='){
           
            map.setElement('p', this.x, this.y);
        }
        
        return map;

    }

   /**
     * Comprueba que el proximo movimiento no sea un obstáculo
     * @param ultimaTeclaPulsada
     * @return 
     */
    private boolean colision(int ultimaTeclaPulsada, Mapa mapa) {
        boolean ok = false;
        boolean border = (x>0 && x<PacmanUtils.COLUMNAS && y>0 && y<PacmanUtils.FILAS);
        if (ultimaTeclaPulsada == KeyEvent.VK_LEFT && border) { 
            ok = mapa.getElement(this.x-1, this.y)=='1'; 
        }
        if (ultimaTeclaPulsada == KeyEvent.VK_RIGHT && border) { 
            ok = mapa.getElement(this.x+1, this.y)=='1';
        }
        if (ultimaTeclaPulsada == KeyEvent.VK_UP && border) { 
            ok = mapa.getElement(this.x, this.y-1)=='1';
        }
        if (ultimaTeclaPulsada == KeyEvent.VK_DOWN && border) {             
            ok = mapa.getElement(this.x, this.y+1)=='1';
        }
             
       
        return ok;
    }
 
 

    //getters && setters
    public int getPuntos() {
        return puntos;
    }   

    public void setPuntos(int puntos) {
        this.puntos = puntos;
    }

    public void setX(int x) {
        this.x = x;
    }

    public void setY(int y) {
        this.y = y;
    }

    public boolean isInvulnerable() {
        return invulnerable;
    }

    public void setInvulnerable(boolean invulnerable) {
        this.invulnerable = invulnerable;
    }
    

    public int getTInvulnerable() {
        return tInvulnerable;
    }

    public void setTInvulnerable(int tInvulnerable) {
        this.tInvulnerable = tInvulnerable;
    }

    public Image getImageR() {
        return imageR;
    }

    public Image getImageL() {
        return imageL;
    }

    public Image getImageU() {
        return imageU;
    }

    public Image getImageD() {
        return imageD;
    }

    public Image getImagenActual() {
        return imagenActual;
    }

    public int getX() {
        return x;
    }

    public int getY() {
        return y;
    }

    public String getPacmanRightPath() {
        return pacmanRightPath;
    }

    public void setPacmanRight(String pacmanRightPath) {
        this.pacmanRightPath = pacmanRightPath;
    }

    public String getPacmanLeftPath() {
        return pacmanLeftPath;
    }

    public void setPacmanLeft(String pacmanLeftPath) {
        this.pacmanLeftPath = pacmanLeftPath;
    }

    public String getPacmanUpPath() {
        return pacmanUpPath;
    }

    public void setPacmanUp(String pacmanUpPath) {
        this.pacmanUpPath = pacmanUpPath;
    }

    public String getPacmanDownPath() {
        return pacmanDownPath;
    }

    public void setPacmanDown(String pacmanDownPath) {
        this.pacmanDownPath = pacmanDownPath;
    }

    public int gettInvulnerable() {
        return tInvulnerable;
    }

    public void settInvulnerable(int tInvulnerable) {
        this.tInvulnerable = tInvulnerable;
    }
    
    
    
    
}
